package cn.donting.jme.edit.ui.inspector.imp.controller;

import cn.donting.jme.edit.attribute.Attribute;
import cn.donting.jme.edit.attribute.StringAttribute;
import cn.donting.jme.edit.attribute.ValueChangeListener;
import cn.donting.jme.edit.ex.AutoAttributeLoader;
import cn.donting.jme.edit.ex.ExResourcesLoad;
import cn.donting.jme.edit.ex.InspectorUILoader;
import cn.donting.jme.edit.scene.ControlAttributesMapper;
import cn.donting.jme.edit.scene.ControlMapper;
import cn.donting.jme.edit.ui.inspector.AttributeInspectorUI;
import cn.donting.jme.edit.ui.inspector.InspectorUI;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import com.jme3.scene.control.Control;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * Controller 属性
 */
public class ControllerInspectorUILoader implements InspectorUILoader {

//    @Override
//    public List<InspectorUI> getInspectorUI(Spatial spatial) throws IOException {
//        List<InspectorUI> inspectorUIS=new ArrayList<>();
//
//        int numControls = spatial.getNumControls();
//        for (int i = 0; i < numControls; i++) {
//            Control control = spatial.getControl(i);
//
//            AttributeInspectorUI attributeInspectorUI=new AttributeInspectorUI(control.getClass().getSimpleName(),null);
//
//            if(control instanceof AbstractControl){
//                attributeInspectorUI.setShowEnable(true);
//                attributeInspectorUI.addEnableListener((oldValue, newValue) -> ((AbstractControl) control).setEnabled(newValue));
//            }
//
//            StringAttribute title=new StringAttribute();
//            title.setValue(control.getClass().getName());
//            title.setEnabled(false);
//            attributeInspectorUI.addAttribute(title);
//
//
//            for (Field field : control.getClass().getFields()) {
//                AutoAttributeLoader autoAttributeLoader = getAutoAttributeLoader(field, spatial);
//                if(autoAttributeLoader!=null){
//                    Attribute attribute = autoAttributeLoader.getAttribute(field, spatial);
//                    if(attribute!=null){
//                        attributeInspectorUI.addAttribute(attribute);
//                    }
//                }
//            }
//        }
//
//
//        return inspectorUIS;
//    }


    private AutoAttributeLoader getAutoAttributeLoader(Field field,Object obj){
        List<AutoAttributeLoader> autoAttributeLoaders = ExResourcesLoad.getAutoAttributeLoaders();
        for (AutoAttributeLoader autoAttributeLoader : autoAttributeLoaders) {
            if (autoAttributeLoader.isLoad(field,obj)) {
                return autoAttributeLoader;
            }
        }
        return null;
    }


    @Override
    public List<InspectorUI> getInspectorUI(Spatial spatial) throws IOException {
        List<InspectorUI> inspectorUIS=new ArrayList<>();

        ControlMapper userData = spatial.getUserData(ControlMapper.key);
        if(userData==null){
            return inspectorUIS;
        }

        ArrayList<ControlAttributesMapper> controlAttributesMappers = userData.getControlAttributesMappers();

        for (ControlAttributesMapper cm : controlAttributesMappers) {
            AttributeInspectorUI attributeInspectorUI = new AttributeInspectorUI(cm.getTitle(),null);

            StringAttribute name=new StringAttribute();
            name.setEnabled(false);
            name.setValue(cm.getClassName());

            ArrayList<Attribute> attributes = cm.getAttributes();
            attributeInspectorUI.addAttribute(attributes);
            inspectorUIS.add(attributeInspectorUI);
        }

        return inspectorUIS;
    }
}
